package com.yunkeji.common.core.domain.event;

import cn.hutool.http.useragent.UserAgent;
import cn.hutool.http.useragent.UserAgentUtil;
import com.yunkeji.common.constant.Constants;
import com.yunkeji.common.enums.UserType;
import com.yunkeji.common.utils.ServletUtils;
import com.yunkeji.common.utils.StringUtils;
import com.yunkeji.common.utils.ip.AddressUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 登录事件
 *
 * @author Lion Li
 */
@Data
@Slf4j
public class LogininforEvent implements Serializable {

    private static final long serialVersionUID = 1L;

    /** 用户账号 */
    private String username;

    /** 登录状态 0成功 1失败 */
    private String status;

    /** 提示消息 */
    private String message;

    /** 请求体 */
    private HttpServletRequest request;

    /** 登陆渠道号 */
    private Integer branch;
    /** * 客户端版本号 */
    private String version;
    /** 手机型号 */
    private String model;
    /** 设备唯一标识符 */
    private String deviceToken;
    /** 操作系统 */
    private String os;
    /** 其他参数 */
    private Object[] args;

    private UserType userType;

    private Long platformId;

    public Logininfor buildEvent() {
        {
            HttpServletRequest request = this.getRequest();
            final UserAgent userAgent = UserAgentUtil.parse(request.getHeader("AppUser-Agent"));
            final String ip = ServletUtils.getClientIP(request);

            String address = AddressUtils.getRealAddressByIP(ip);
            StringBuilder s = new StringBuilder();
            s.append(getBlock(ip));
            s.append(address);
            s.append(getBlock(this.getUsername()));
            s.append(getBlock(this.getStatus()));
            s.append(getBlock(this.getMessage()));
            // 打印信息到日志
            log.info(s.toString(), this.getArgs());
            // 获取客户端操作系统
            // String os = userAgent.getOs().getName();
            // 获取客户端浏览器
            // String browser = userAgent.getBrowser().getName();
            // 封装对象
            Logininfor logininfor = new Logininfor();
            logininfor.setUserName(this.getUsername());
            logininfor.setIpaddr(ip);
            logininfor.setLoginLocation(address);
            logininfor.setBrowser(userAgent != null ? userAgent.getBrowser().getName() : "未知");
            logininfor.setUserType(this.getUserType().getUserType());
            logininfor.setOs(userAgent != null ? userAgent.getOs().getName() : this.getOs());
            logininfor.setBranch(this.getBranch());
            logininfor.setVersion(this.getVersion());
            logininfor.setModel(this.getModel());
            logininfor.setDeviceToken(this.getDeviceToken());
            logininfor.setMsg(this.getMessage());
            logininfor.setPlatformId(this.getPlatformId());
            // 日志状态
            if (StringUtils.equalsAny(
                    this.getStatus(),
                    Constants.LOGIN_SUCCESS,
                    Constants.LOGOUT,
                    Constants.REGISTER)) {
                logininfor.setStatus(Constants.SUCCESS);
            } else if (Constants.LOGIN_FAIL.equals(this.getStatus())) {
                logininfor.setStatus(Constants.FAIL);
            }
            // 插入数据
            return logininfor;
        }
    }

    private String getBlock(Object msg) {
        if (msg == null) {
            msg = "";
        }
        return "[" + msg.toString() + "]";
    }
    /**
     * 系统访问记录表 sys_logininfor
     *
     * @author Lion Li
     */
    @Data
    public class Logininfor implements Serializable {
        private static final long serialVersionUID = 1L;

        /** ID */
        private Long infoId;

        /** 用户账号 */
        private String userName;

        /** 登录状态 0成功 1失败 */
        private String status;

        /** 登录IP地址 */
        private String ipaddr;

        /** 登录地点 */
        private String loginLocation;

        /** 浏览器类型 */
        private String browser;

        /** 操作系统 */
        private String os;

        /** 提示消息 */
        private String msg;

        /** 访问时间 */
        private Date loginTime;

        /** 请求参数 */
        private Map<String, Object> params = new HashMap<>();

        /** 后台用户/客户端用户 */
        private String userType;

        /** 登陆渠道号 */
        private Integer branch;
        /** * 客户端版本号 */
        private String version;
        /** 手机型号 */
        private String model;
        /** 设备唯一标识符 */
        private String deviceToken;

        private Long platformId;
    }
}
